//给你一个整数 x ，如果 x 是一个回文整数，返回 true ；否则，返回 false 。
//
// 回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。例如，121 是回文，而 123 不是。 
//
// 
//
// 示例 1： 
//
// 
//输入：x = 121
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：x = -121
//输出：false
//解释：从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
// 
//
// 示例 3： 
//
// 
//输入：x = 10
//输出：false
//解释：从右向左读, 为 01 。因此它不是一个回文数。
// 
//
// 示例 4： 
//
// 
//输入：x = -101
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// -2³¹ <= x <= 2³¹ - 1 
// 
//
// 
//
// 进阶：你能不将整数转为字符串来解决这个问题吗？ 
// Related Topics 数学 👍 1652 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean isPalindrome(int x) {
        boolean result;

//        result = this.solution1(x);

//        result = this.solution2(x);

        result = this.solution3(x);

        return result;
    }

    /**
     * 解法1：
     * 常规思路：将数字转换为字符数组，然后分别比较第一位与最后一位，第二位与倒数第二位，以此类推
     * 解答成功:
     * 执行耗时:10 ms,击败了38.94% 的Java用户
     * 内存消耗:37.5 MB,击败了94.49% 的Java用户
     *
     * @param x
     * @return
     */
    private boolean solution1(int x) {
        // 先处理特殊情况
        // 如果是负数，则肯定不是回文数
        if (x < 0) {
            return false;
        }

        // 如果数字只有1位，则肯定是回文数
        if (x < 10) {
            return true;
        }

        // 如果数字是10的倍数，则肯定不是回文数
        if (x % 10 == 0) {
            return false;
        }

        // 将数字转化为字符数组
        char[] chars = String.valueOf(x).toCharArray();

        int length = chars.length;
        // 长度为偶数，eg：1221，那么第一位和最后一位比较，第二位和倒数第二位比较，依此类推
        for (int i = 0; i < chars.length / 2; i++) {
            if (chars[i] != chars[length - i - 1]) {
                return false;
            }
        }

        return true;
    }

    /**
     * 解法2：
     * 将数字逆序后和原数字比较，相同则是回文数
     * 解答成功:
     * 执行耗时:12 ms,击败了18.54% 的Java用户
     * 内存消耗:38.2 MB,击败了15.65% 的Java用户
     *
     * @param x
     * @return
     */
    private boolean solution2(int x) {
        // 先处理特殊情况
        // 如果是负数，则肯定不是回文数
        if (x < 0) {
            return false;
        }

        // 如果数字只有1位，则肯定是回文数
        if (x < 10) {
            return true;
        }

        // 如果数字是10的倍数，则肯定不是回文数
        if (x % 10 == 0) {
            return false;
        }

        // 将数字转化为字符数组
        char[] chars = String.valueOf(x).toCharArray();

        int length = chars.length;
        // 长度为偶数，eg：1221，那么第一位和最后一位比较，第二位和倒数第二位比较，依此类推
        char[] temp = new char[chars.length];
        for (int i = 0; i < chars.length; i++) {
            temp[length - 1 - i] = chars[i];
        }

        int reverse;
        try {
            reverse = Integer.parseInt(String.valueOf(temp));
        } catch (Exception e) {
            return false;
        }

        return Integer.valueOf(x).equals(reverse);
    }

    // 以下为别人的解法

    /**
     * 逆序比较字符串，使用了StringBuilder的reverse方法
     * 比我自己写的简单了无数倍
     *
     * @param x
     * @return
     */
    private boolean solution3(int x) {
        String reversedStr = (new StringBuilder(x + "")).reverse().toString();
        return (x + "").equals(reversedStr);
    }

}
//leetcode submit region end(Prohibit modification and deletion)
